100 REM OPEN 1,8,1,"@0:FREQ.CNTR.@C000" :REM FILE FOR OBJECT CODE 110 SYS 700 ;PAL 64 ASSEMBLER 120 .OPT OO 130 ; SAVE"@0:FREQ CNTR.PAL",8 140 ;---------------------------------- 150 ;- FREQUENCY COUNTER - 160 ;- SOURCE CODE - 170 ;---------------------------------- 180 ; USES CIA #2, TIMER A 190 ; COUNT IS STORED AT 680, 681 200 ; GATE VALUE IS STORED AT 822 210 ; OVERFLOW SETS 823 220 ;.OPT O1 ;SENDS OBJECT CODE TO DISK 230 ; 240 *=$C000 ;START ADDRESS 250 ;SYS 49152-TO START COUNTING 260 ;SYS 49155-TO STOP COUNTING AND DISABLE INTERRUPT WEDGE 270 ;SYSTEM EQUATES 280 CIA2 =$DD00 290 TALO =CIA2+$04;TIMER A COUNT REGISTERS 300 TAHI =CIA2+$05 310 ICR =CIA2+$0D;CIA INTERRUPT CONTROL REGISTER 320 CRA =CIA2+$0E;CIA CONTROL REGISTER 330 OLDIRQ =$0334 ;STORAGE FOR OLD IRQ 340 IRQVEC =$0314 350 FLAG =679 360 COUNT =680 370 GATE =$0336 ;STORAGE FOR COUNT DOWN VALUE 380 OVERFLOW =823 390 ; 400 JMP CONNECT 410 ;DISCONNECT ROUTINE 420 SEI 430 LDA OLDIRQ ;PUT OLD IRQ VECTOR BACK 440 STA IRQVEC ; IN 450 LDA OLDIRQ+1 460 STA IRQVEC+1 470 LDA #$00 480 STA CRA ;STOP TIMER 490 CLI 500 RTS 510 ; 520 CONNECT =* 530 SEI ;DISABLE INTERRUPTS 540 LDA IRQVEC 550 STA OLDIRQ ;STORE OLD IRQ VECTOR 560 LDA IRQVEC+1 570 STA OLDIRQ+1 580 LDA #START ;SAME WITH HIGH BYTE 610 STA IRQVEC+1 620 LDA #$FF 630 STA TALO 640 STA TAHI ;LOAD TIMER LATCH WITH MAXIMUM COUNT 650 LDA #60 660 STA GATE ;USE A DEFAULT VALUE OF 60 670 LDA GATE ;GET COUNT-DOWN VALUE 680 STA FLAG ;PUT IT IN THE FLAG REGISTER 690 LDA #$00 700 STA ICR ;DISABLE CIA INTERUPTS 710 LDA #%00110001 720 STA CRA ;FORCE LOAD AND START COUNTING 730 CLI 740 RTS ;ALL DONE SO RETURN 750 ; 760 ;COUNTER ROUTINE STARTS HERE 770 START =* 780 ; 790 DEC FLAG ;CHECK COUNTDOWN FLAG 800 BNE DONE ;NOT TIMED OUT SO EXIT 810 GETCNT =* ;ROUTINE TO READ COUNT 820 LDA GATE 830 STA FLAG ;RESET FLAG FOR NEXT TIME 840 LDA #%00100000 ;SET BIT 5 850 STA CRA ;TO STOP TIMER 860 LDA TALO 870 EOR #$FF 880 STA COUNT ;CONVERT TO UP-COUNTER AND STORE RESULT 890 LDA TAHI 900 EOR #$FF 910 STA COUNT+1 ;SAME WITH HIGH BYTE 920 LDA #$FF 930 STA TALO 940 STA TAHI ;RESET TIMER LATCH 950 LDA #%00110001 ;FORCE LOAD + START TIMER 960 STA CRA 970 LDA ICR 980 AND #%00000011 ;MASK OFF UPPER 6 BITS OF STATUS REGISTER 990 STA OVERFLOW ;AND SAVE IT 1000 ; 1010 ; 1020 DONE =* 1030 JMP (OLDIRQ) ;(null) TO NORMAL IRQ ROUTINE 1040 ; 1050 .END